#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<assert.h>
#include<sys/types.h>
#include<sys/wait.h>

int main(int argc,char* argv[])
{
    //-----------多进程---------//
    printf("process is running!\n");
    pid_t id = fork();
    assert(id!=-1);
    if(id==0)
    {

        //让自己的程序执行系统命令
        //./myexec ls -a -l
        execvp(argv[1],&argv[1]);


        //这里的替换会影响父进程吗？？？
        //不会，因为进程具有独立性。
        

        //execl("/usr/bin/ls","ls","-a","-l","--color=auto",NULL);
        //execlp("ls","ls","-a","-l","--color=auto",NULL);
        //char* const argv_[]= { "ls","-a","-l","--color=auto", NULL };
        //execv("/usr/bin/ls", argv_);
        //execvp("ls",argv_);
        //execl("./mybin","mybin",NULL); 
        //execl("./mycpp","mycpp",NULL);
    
        //char* const envp_[]={(char*)"MYENV=111222333444",NULL};
        //execle("./mybin","mybin",NULL,envp_);//自定义环境变量
        //extern char** const environ;
        //execle("./mybin","mybin",NULL,environ);//系统环境变量。实际上默认环境变量，不传，子进程也能获取
        
        //putelenv("MYENV=1234545");//将指定的环境变量导入到系统中，environ指向的环境表 
        //execle("./mybin","mybin",NULL,environ);
        //char* const argv_[]={"mybin",NULL};
        //execve("mybin",argv_,environ);
        

        exit(1);//must failed
    }
    int status=0;
    pid_t ret = waitpid(id,&status,0);
    if(ret>0)
    {
        printf("wait success! child code:%d, sig:%d\n",getpid(),getppid());
    }
    
    
   // //-----------单进程------------//
   // //.c -> exe -> load -> process -> 运行 -> 执行我们现在所写的代码
   // printf("process is running...\n");
   // //load -> exe  
   // execl("/usr/bin/ls"/*要执哪一个程序*/,"ls","--color=auto","-a","-l",NULL/*你想怎么去执行*/);//all exec* end of NULL
   // //只要是一个函数，调用就有可能失败，就是没有替换成功，就是没有替换
   // //exec* 为什么成功没有返回值呢？？？
   // //因为成功了之后，就和接下来的代码无关了，判断毫无意义
   // //execl("/usr/bin/lafeafjfle"/*要执哪一个程序*/,"ls","--color=auto","-a","-l",NULL/*你想怎么去执行*/);//all exec* end of NULL
   // perror("execl");
   // //为什么这里的printf没有被执行呢？？？
   // //printf也是代码，是在execl之后的。execl在执行完毕的时候，代码已经被全部覆盖,开始执行新的程序的代码了，所以printf无法被执行！
   // printf("process running done...\n");
   // exit(1);
   // 
}
